`timescale 1ns/100ps

module PRV564_tb();
    reg clock,reset;
    wire           ITLB_FIB_WRENo,DTLB_FIB_WRENo,ICache_FIB_WRENo,DCache_FIB_WRENo;        //write to DTLB_FIB enable
    wire           ITLB_FIB_REQo,DTLB_FIB_REQo,ICache_FIB_REQo,DCache_FIB_REQo;        //request DTLB_FIB trans
    wire           ITLB_FIB_ACKi,DTLB_FIB_ACKi,ICache_FIB_ACKi,DCache_FIB_ACKi;        //request acknowledge
    wire           ITLB_FIB_FULLi,DTLB_FIB_FULLi,ICache_FIB_FULLi,DCache_FIB_FULLi;       //DTLB_FIB FIFO full
    wire [7:0]     ITLB_FIB_IDo,DTLB_FIB_IDo,ICache_FIB_IDo,DCache_FIB_IDo;
    wire [7:0]     ITLB_FIB_CMDo,DTLB_FIB_CMDo,ICache_FIB_CMDo,DCache_FIB_CMDo;
    wire [3:0]     ITLB_FIB_BURSTo,DTLB_FIB_BURSTo,ICache_FIB_BURSTo,DCache_FIB_BURSTo;
    wire [3:0]     ITLB_FIB_SIZEo,DTLB_FIB_SIZEo,ICache_FIB_SIZEo,DCache_FIB_SIZEo;
    wire [39:0]    ITLB_FIB_ADDRo,DTLB_FIB_ADDRo, ICache_FIB_ADDRo, DCache_FIB_ADDRo;    
    wire [63:0]    ITLB_FIB_DATAo,DTLB_FIB_DATAo,ICache_FIB_DATAo, DCache_FIB_DATAo;
    wire [7:0]     ITLB_FIB_IDi,DTLB_FIB_IDi,ICache_FIB_IDi,DCache_FIB_IDi;
    wire [7:0]     ITLB_FIB_RPLi,DTLB_FIB_RPLi,ICache_FIB_RPLi,DCache_FIB_RPLi;
    wire           ITLB_FIB_Vi,DTLB_FIB_Vi,ICache_FIB_Vi,DCache_FIB_Vi;
    wire [63:0]    ITLB_FIB_DATAi, DTLB_FIB_DATAi,ICache_FIB_DATAi, DCache_FIB_DATAi;
//CPU Cache FIB

reg [31:0]simmem[512*1024-1:0];
wire [23:0] SRAM_RAddr1,SRAM_RAddr2,
            SRAM_RAddr3,SRAM_RAddr4;
wire [23:0] SRAM_WAddr1,SRAM_WAddr2,
            SRAM_WAddr3,SRAM_WAddr4;
wire [7:0]  SRAM_WBMask1,SRAM_WBMask2,
            SRAM_WBMask3,SRAM_WBMask4;
wire [63:0] SRAM_WData1,SRAM_WData2,
            SRAM_WData3,SRAM_WData4;
wire    SRAM_CE1,SRAM_CE2,
        SRAM_CE3,SRAM_CE4;
reg  [63:0] SRAM_RData1,SRAM_RData2,
            SRAM_RData3,SRAM_RData4;

reg [31:0]cyclecnt;
integer i;
initial 
begin
    $dumpfile("./temp/PRV564_tb.vcd");
    $dumpvars();
    for(i=0;i<512*1024;i=i+1)
    begin
        simmem[i]=$random;
    end
    $readmemh("D:/Projects/vostok564/TestBin/microbench.bin.hex",simmem,19'h0,19'd65535);
    #0 clock=0;reset=1;cyclecnt<=0;
    #105 reset=0;
end

always #10 clock=~clock;
// always @(posedge clock)
// begin
//     cyclecnt<=cyclecnt+1;
//     if(cyclecnt==32'h1ff)
//         $finish;
// end
always @(*)
begin
    SRAM_RData1={simmem[{SRAM_RAddr1[18:0],1'b1}],simmem[{SRAM_RAddr1[18:0],1'b0}]};
    SRAM_RData2={simmem[{SRAM_RAddr2[18:0],1'b1}],simmem[{SRAM_RAddr2[18:0],1'b0}]};
    SRAM_RData3={simmem[{SRAM_RAddr3[18:0],1'b1}],simmem[{SRAM_RAddr3[18:0],1'b0}]};
    SRAM_RData4={simmem[{SRAM_RAddr4[18:0],1'b1}],simmem[{SRAM_RAddr4[18:0],1'b0}]};
    
end
ysyx_210152_PRV564_top #(
    .HART_ID        (8'h0)
)PRV564_top(
    .GLB_CLKi                   (clock),
    .GLB_ARSTi                  (reset),
//----------------Flexible Interconnection Bus----------
    .ITLB_FIB_WRENo             (ITLB_FIB_WRENo), 
    .DTLB_FIB_WRENo             (DTLB_FIB_WRENo),
    .ITLB_FIB_REQo              (ITLB_FIB_REQo),  
    .DTLB_FIB_REQo              (DTLB_FIB_REQo),
    .ITLB_FIB_ACKi              (ITLB_FIB_ACKi),  
    .DTLB_FIB_ACKi              (DTLB_FIB_ACKi),
    .ITLB_FIB_FULLi             (ITLB_FIB_FULLi), 
    .DTLB_FIB_FULLi             (DTLB_FIB_FULLi),
    .ITLB_FIB_IDo               (ITLB_FIB_IDo),   
    .DTLB_FIB_IDo               (DTLB_FIB_IDo),
    .ITLB_FIB_CMDo              (ITLB_FIB_CMDo),  
    .DTLB_FIB_CMDo              (DTLB_FIB_CMDo),
    .ITLB_FIB_BURSTo            (ITLB_FIB_BURSTo),
    .DTLB_FIB_BURSTo            (DTLB_FIB_BURSTo),
    .ITLB_FIB_SIZEo             (ITLB_FIB_SIZEo), 
    .DTLB_FIB_SIZEo             (DTLB_FIB_SIZEo),
    .ITLB_FIB_ADDRo             (ITLB_FIB_ADDRo), 
    .DTLB_FIB_ADDRo             (DTLB_FIB_ADDRo),    
    .ITLB_FIB_DATAo             (ITLB_FIB_DATAo),
    .DTLB_FIB_DATAo             (DTLB_FIB_DATAo),
    //             FIB result port
    .ITLB_FIB_IDi               (ITLB_FIB_IDi),
    .DTLB_FIB_IDi               (DTLB_FIB_IDi),
    .ITLB_FIB_RPLi              (ITLB_FIB_RPLi),  
    .DTLB_FIB_RPLi              (DTLB_FIB_RPLi),
    .ITLB_FIB_Vi                (ITLB_FIB_Vi),
    .DTLB_FIB_Vi                (DTLB_FIB_Vi),
    .ITLB_FIB_DATAi             (ITLB_FIB_DATAi),
    .DTLB_FIB_DATAi             (DTLB_FIB_DATAi),
//CPU Cache FIB
    .ICache_FIB_WRENo           (ICache_FIB_WRENo), 
    .DCache_FIB_WRENo           (DCache_FIB_WRENo),
    .ICache_FIB_REQo            (ICache_FIB_REQo),  
    .DCache_FIB_REQo            (DCache_FIB_REQo),
    .ICache_FIB_ACKi            (ICache_FIB_ACKi),  
    .DCache_FIB_ACKi            (DCache_FIB_ACKi),
    .ICache_FIB_FULLi           (ICache_FIB_FULLi),
    .DCache_FIB_FULLi           (DCache_FIB_FULLi),
    .ICache_FIB_IDo             (ICache_FIB_IDo),
    .DCache_FIB_IDo             (DCache_FIB_IDo),
    .ICache_FIB_CMDo            (ICache_FIB_CMDo),
    .DCache_FIB_CMDo            (DCache_FIB_CMDo),
    .ICache_FIB_BURSTo          (ICache_FIB_BURSTo),
    .DCache_FIB_BURSTo          (DCache_FIB_BURSTo),
    .ICache_FIB_SIZEo           (ICache_FIB_SIZEo), 
    .DCache_FIB_SIZEo           (DCache_FIB_SIZEo),
    .ICache_FIB_ADDRo           (ICache_FIB_ADDRo), 
    .DCache_FIB_ADDRo           (DCache_FIB_ADDRo),    
    .ICache_FIB_DATAo           (ICache_FIB_DATAo), 
    .DCache_FIB_DATAo           (DCache_FIB_DATAo),
    //               FIB result port
    .ICache_FIB_IDi             (ICache_FIB_IDi),
    .DCache_FIB_IDi             (DCache_FIB_IDi),
    .ICache_FIB_RPLi            (ICache_FIB_RPLi),
    .DCache_FIB_RPLi            (DCache_FIB_RPLi),
    .ICache_FIB_Vi              (ICache_FIB_Vi),
    .DCache_FIB_Vi              (DCache_FIB_Vi),
    .ICache_FIB_DATAi           (ICache_FIB_DATAi), 
    .DCache_FIB_DATAi           (DCache_FIB_DATAi),
//---------------Interrupt signal-------------------------
    .Kernel_MTIi                (Kernel_MTIi),          //YSYX210152_Machine mode timer interrupt
    .Kernel_MSIi                (Kernel_MSIi),          //YSYX210152_Machine mode software interrupt
    .Kernel_MEIi                (Kernel_MEIi),          //YSYX210152_Machine mode ext interrupt
    .Kernel_SEIi                (Kernel_SEIi),          //YSYX210152_Supervisior mode ext interrupt
    .Kernel_NMIPLi              (1'b0),                 //NO NMI is used!
    .Kernel_NMIEEi              (1'b0),
    .Kernel_NMIGi               (1'b0),
//--------------YSYX210152_Machine mode timer-----------------------
    .Kernel_MTIMEi              (Kernel_MTIMEi)	        //YSYX210152_Machine mode timer value in
);
 FIB_L1_Test BUS_PROVIDER_ITLB
 (
    .VFIBi_CLK(clock),
    .VFIBi_ARST(reset),
    .VFIBi_REQ(ITLB_FIB_REQo),
    .VFIBi_WREN(ITLB_FIB_WRENo), 
    .VFIBi_ID(ITLB_FIB_IDo),
    .VFIBi_CMD(ITLB_FIB_CMDo),
    .VFIBi_BURST(ITLB_FIB_BURSTo),
    .VFIBi_SIZE(ITLB_FIB_SIZEo),
    .VFIBi_ADDR(ITLB_FIB_ADDRo),
    .VFIBi_DATA(ITLB_FIB_DATAo),
    .VFIBo_FULL(ITLB_FIB_FULLi),
    .VFIBo_V(ITLB_FIB_Vi),
    .VFIBo_ID(ITLB_FIB_IDi),
    .VFIBo_RPL(ITLB_FIB_RPLi),
    .VFIBo_DATA(ITLB_FIB_DATAi),

    .SRAM_RAddr(SRAM_RAddr1),
    .SRAM_WAddr(SRAM_WAddr1),
    .SRAM_WBMask(SRAM_WBMask1),
    .SRAM_WData(SRAM_WData1),
    .SRAM_CE(SRAM_CE1),
    .SRAM_RData(SRAM_RData1)

);
 FIB_L1_Test BUS_PROVIDER_DTLB
 (
    .VFIBi_CLK(clock),
    .VFIBi_ARST(reset),
    .VFIBi_ID(DTLB_FIB_IDo),
    .VFIBi_REQ(DTLB_FIB_REQo),
    .VFIBi_WREN(DTLB_FIB_WRENo),      //write to FIB enable
    .VFIBi_CMD(DTLB_FIB_CMDo),
    .VFIBi_BURST(DTLB_FIB_BURSTo),
    .VFIBi_SIZE(DTLB_FIB_SIZEo),
    .VFIBi_ADDR(DTLB_FIB_ADDRo),
    .VFIBi_DATA(DTLB_FIB_DATAo),
    .VFIBo_FULL(DTLB_FIB_FULLi),
    .VFIBo_V(DTLB_FIB_Vi),
    .VFIBo_ID(DTLB_FIB_IDi),
    .VFIBo_RPL(DTLB_FIB_RPLi),
    .VFIBo_DATA(DTLB_FIB_DATAi),

    .SRAM_RAddr(SRAM_RAddr2),
    .SRAM_WAddr(SRAM_WAddr2),
    .SRAM_WBMask(SRAM_WBMask2),
    .SRAM_WData(SRAM_WData2),
    .SRAM_CE(SRAM_CE2),
    .SRAM_RData(SRAM_RData2)

);
 FIB_L1_Test BUS_PROVIDER_ICACHE
 (
    .VFIBi_CLK(clock),
    .VFIBi_ARST(reset),
    .VFIBi_ID(ICache_FIB_IDo),
    .VFIBi_REQ(ICache_FIB_REQo),
    .VFIBi_WREN(ICache_FIB_WRENo), 
    .VFIBi_CMD(ICache_FIB_CMDo),
    .VFIBi_BURST(ICache_FIB_BURSTo),
    .VFIBi_SIZE(ICache_FIB_SIZEo),
    .VFIBi_ADDR(ICache_FIB_ADDRo),
    .VFIBi_DATA(ICache_FIB_DATAo),
    .VFIBo_FULL(ICache_FIB_FULLi),
    .VFIBo_V(ICache_FIB_Vi),
    .VFIBo_ID(ICache_FIB_IDi),
    .VFIBo_RPL(ICache_FIB_RPLi),
    .VFIBo_DATA(ICache_FIB_DATAi),

    .SRAM_RAddr(SRAM_RAddr3),
    .SRAM_WAddr(SRAM_WAddr3),
    .SRAM_WBMask(SRAM_WBMask3),
    .SRAM_WData(SRAM_WData3),
    .SRAM_CE(SRAM_CE3),
    .SRAM_RData(SRAM_RData3)

);
 FIB_L1_Test BUS_PROVIDER_DCACHE
 (
    .VFIBi_CLK(clock),
    .VFIBi_ARST(reset),
    .VFIBi_ID(DCache_FIB_IDo),
    .VFIBi_REQ(DCache_FIB_REQo),
    .VFIBi_WREN(DCache_FIB_WRENo), 
    .VFIBi_CMD(DCache_FIB_CMDo),
    .VFIBi_BURST(DCache_FIB_BURSTo),
    .VFIBi_SIZE(DCache_FIB_SIZEo),
    .VFIBi_ADDR(DCache_FIB_ADDRo),
    .VFIBi_DATA(DCache_FIB_DATAo),
    .VFIBo_FULL(DCache_FIB_FULLi),
    .VFIBo_V(DCache_FIB_Vi),
    .VFIBo_ID(DCache_FIB_IDi),
    .VFIBo_RPL(DCache_FIB_RPLi),
    .VFIBo_DATA(DCache_FIB_DATAi),

    .SRAM_RAddr(SRAM_RAddr4),
    .SRAM_WAddr(SRAM_WAddr4),
    .SRAM_WBMask(SRAM_WBMask4),
    .SRAM_WData(SRAM_WData4),
    .SRAM_CE(SRAM_CE4),
    .SRAM_RData(SRAM_RData4)

);
endmodule
